#ifndef _SCOMMAND_H
#define _SCOMMAND_H


#include "bool.h"

typedef struct s_scommand_t *scommand_t;
/*Crea la estrutura scommand, y la retorna, en caso de error regresa NULL*/
scommand_t scommand_create(void);

/*Destruye la estrutura s command*/
void scommand_destroy(scommand_t sc);

/*clona */
scommand_t scommand_clone(const scommand_t sc );

/*<------------------------------------------------------------->*/

/*Agrega un string por atras a la estructura scommand,
 sc!=NULL str!=NULL, si esto sucede entonces el pocedimiento no hace nada*/
void scommand_push_back(scommand_t sc, const char *str);

/*retorna los string que fueron agregados por scommand_push_back
NO DEBE llamarse si scommand_is_empty(sc)==NULL
en caso de error regresa NULL*/
char* scommand_get_front(scommand_t sc);

/*<------------------------------------------------------------->*/

/*Agrega un string al redirector de entrada
sc!=NULL str!=NULL caso contrario no hace nada el procedimiento y se ejecuta una asercion*/
void scommand_set_redir_in(scommand_t sc, const char *str);

/*Agrega un string al redirector de entrada
sc!=NULL str!=NULL caso contrario no hace nada el procedimiento y se ejecuta una asercion*/
char *scommand_get_redir_in(const scommand_t sc);

/*Agrega un string al redirector de salida
sc!=NULL str!=NULL caso contrario no hace nada el procedimiento y se ejecuta una asercion*/
void scommand_set_redir_out(scommand_t sc, const char *str);
char *scommand_get_redir_out(const scommand_t sc);

/*<------------------------------------------------------------->*/
/*Modifica el comando principal del scommand
sc!=NULL str!=NULL caso contrario no hace nada el procedimiento y se ejecuta una asercion*/
void scommand_set_command(scommand_t sc, char *str);

/*Retorna el comando principal del scommand
sc!=NULL caso contrario no se ejecuta la funcion*/
char *scommand_get_command(const scommand_t sc);

/*Retorna un arreglo con los comandos almacenados en el scommand
sc!=NULL caso contrario no se ejecuta la funcion*/
char **scommand_get_string(const scommand_t sc);

/*<------------------------------------------------------------->*/
/*Modifican los valores de la variable wait, que determina si existe o no un amperson en la linea de comando*/
void scommand_set_wait(scommand_t sc, bool b);
bool scommand_get_wait(const scommand_t sc);
/*<------------------------------------------------------------->*/
/*Modifican los valores de la variable builtin, que determina que tipo de comando es*/
void scommand_set_builtin(scommand_t sc, bool b);
bool scommand_get_builtin(const scommand_t sc);
/*<------------------------------------------------------------->*/
/*funcion booleana que brindan informacion acerca de si el scommand esta vacio*/
bool scommand_is_empty(const scommand_t sc);

/*funciones booleanas que brindan informacion acerca del estado de las variables, redir_in redir_out*/
bool exist_redir_in(const scommand_t sc);
bool exist_redir_out(const scommand_t sc);

#endif
